package offer;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * @author ZhanBo
 * @date 2020/6/27
 */
public class Solution34 {


    public static void main(String[] args) {

    }

    /**
     * 剑指 Offer 34. 二叉树中和为某一值的路径
     * 输入一棵二叉树和一个整数，打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
     * 给定如下二叉树，以及目标和 sum = 22，
     *               5
     *              / \
     *             4   8
     *            /   / \
     *           11  13  4
     *          /  \    / \
     *         7    2  5   1
     *返回:
     *[
     *    [5,4,11,2],
     *    [5,8,4,5]
     * ]
     * @param root
     * @param sum
     * @return
     */
    public List<List<Integer>> pathSum(TreeNode root, int sum) {
        recur(root, sum);
        return result;
    }

    /**
     * 结果
     */
    private LinkedList<List<Integer>> result = new LinkedList<>();
    /**
     * 路径
     */
    private LinkedList<Integer> path = new LinkedList<>();

    /**
     * 先序遍历+保存路径
     * @param root
     * @param tar
     */
    private void recur(TreeNode root, int tar) {
        if(root == null) {
            return;
        }
        //保存路径
        path.add(root.val);
        tar -= root.val;
        //路径正确，且最后一个节点为叶子节点
        if(tar == 0 && root.left == null && root.right == null) {
            result.add(new LinkedList(path));
        }
        recur(root.left, tar);
        recur(root.right, tar);
        //回溯改变路径
        path.removeLast();
    }
}
